package com.zkq.lvse.common.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.criterion.Criterion;

/**
 * 
 * @author zkq
 *
 */
public interface SimpleDao<T,PK extends Serializable> {
	/**
	 * 取得对象主键名
	 * @return
	 */
	public String getIdName();
	/**
	 * 根据SQL创建SQLQuery对象
	 * @param hql
	 * @param values	数量可变参数，按顺序绑定
	 * @return
	 */
	public SQLQuery createSqlQuery(final String sql,Object... values);
	/**
	 * 根据SQL创建SQLQuery对象
	 * @param hql
	 * @param values	数量可变参数，按名称绑定
	 * @return
	 */
	public SQLQuery createSqlQuery(final String sql,Map<String, ?> values);
	/**
	 * 根据HQL,values创建Query对象
	 * @param hql
	 * @param values	数量可变参数，按顺序绑定
	 * @return
	 */
	public Query createQuery(final String hql,Object... values); 
	/**
	 * 根据HQL,values创建Query对象
	 * @param hql
	 * @param values	数量可变参数，按名称绑定
	 * @return
	 */
	public Query createQuery(final String hql,final Map<String, ?> values); 
	/**
	 * 根据id删除一条数据
	 * @param id
	 */
	public void delete(final PK id);
	/**
	 * 根据实体类删除一条数据
	 * @param entity
	 */
	public void delete(final T entity);
	/**
	 * 执行HQL进行批量修改/删除
	 * @param hql
	 * @param values	数量可变参数，按顺序绑定
	 */
	public int delAll(final String hql,final Object... values);
	/**
	 * 执行HQL进行批量修改/删除
	 * @param hql
	 * @param values	数量可变参数，按名称绑定
	 */
	public int delAll(final String hql,final Map<String, ?> values);
	/**
	 * 添加数据
	 * @param entity
	 */
	public void save(final T entity);
	/**
	 * 修改数据
	 * @param entity
	 */
	public void update(final T entity);
	/**
	 * 添加或修改数据
	 * @param entity
	 */
	public void saveOrUpdate(final T entity);
	/**
	 * 查询对象列表
	 * @param hql
	 * @param values	数量可变参数，按顺序绑定
	 * @return
	 */
	public List<T> find(final String hql,final Object... values);
	/**
	 * 查询对象列表
	 * @param hql
	 * @param values	数量可变参数，按名称绑定
	 * @return
	 */
	public List<T> find(final String hql,final Map<String, ?> values);
	/**
	 * 根据Id查询实体对象
	 * @param id
	 * @return
	 */
	public T get(final PK id);
	/**
	 * 根据属性查找唯一对象
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public T findUnique(final String propertyName,final Object value);
	/**
	 * 根据Criterion查找唯一对象
	 * @param criterions	数量可变参数，按顺序绑定
	 * @return
	 */
	public T findUnique(final Criterion... criterions);
	/**
	 * 根据Id列表获取对象列表
	 * @param ids
	 * @return
	 */
	public List<T> find(final Collection<PK> ids);
	/**
	 * 根据Id列表获取对象列表并排序
	 * @param ids
	 * @return
	 */
	public List<T> find(final String order,final Collection<PK> ids);
	/**
	 * 根据Criteria查询对象列表
	 * @param criteria	数量可变参数，按顺序绑定
	 * @return
	 */
	public List<T> find(final Criterion... criterions);
	/**
	 * 根据Criteria查询对象列表并排序
	 * @param criteria
	 * @return
	 */
	public List<T> find(final String order,final Criterion criterions);
	/**
	 * 根据属性查找对象列表
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public List<T> findBy(final String propertyName,final Object value);
	/**
	 * 根据SQL查询对象列表
	 * @param sql
	 * @param entity
	 * @return
	 */
	public List<T> findAll(final String sql,final Class<T> entity);
	/**
	 * 查询所有对象列表
	 * @return
	 */
	public List<T> getAll();
	
}
